/* Copyright (c) 2008-2010, developers of the Ascension Log Visualizer
 *
 * Permission is hereby granted, free of charge, to any person
 * obtaining a copy of this software and associated documentation
 * files (the "Software"), to deal in the Software without
 * restriction, including without limitation the rights to use,
 * copy, modify, merge, publish, distribute, sublicense, and/or
 * sell copies of the Software, and to permit persons to whom
 * the Software is furnished to do so, subject to the following
 * conditions:
 *
 * The above copyright notice and this permission notice shall be
 * included in all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
 * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
 * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
 * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
 * OTHER DEALINGS IN THE SOFTWARE.
 */

package com.googlecode.logVisualizer.logData;

/**
 * A container class to store mp gains of all sorts.
 */
public final class MPGain {
    private int encounterMPGain;

    private int starfishMPGain;

    private int restingMPGain;

    private int outOfEncounterMPGain;

    private int consumableMPGain;

    /**
     * @return The MP gains during encounters. This does not include starfish mp
     *         gains or mp gains from resting.
     */
    public int getEncounterMPGain() {
        return encounterMPGain;
    }

    /**
     * @param encounterMPGain
     *            The encounter mp gain to set. This should not include starfish
     *            mp gains or mp gains from resting.
     */
    public void setEncounterMPGain(
                                   final int encounterMPGain) {
        this.encounterMPGain = encounterMPGain;
    }

    /**
     * @param encounterMPGain
     *            The encounter mp gain to add. This should not include starfish
     *            mp gains or mp gains from resting.
     */
    public void addEncounterMPGain(
                                   final int encounterMPGain) {
        this.encounterMPGain += encounterMPGain;
    }

    /**
     * @return The MP gains from starfish familiars.
     */
    public int getStarfishMPGain() {
        return starfishMPGain;
    }

    /**
     * @param starfishMPGain
     *            The starfish mp gain to set.
     */
    public void setStarfishMPGain(
                                  final int starfishMPGain) {
        this.starfishMPGain = starfishMPGain;
    }

    /**
     * @param starfishMPGain
     *            The starfish mp gain to add.
     */
    public void addStarfishMPGain(
                                  final int starfishMPGain) {
        this.starfishMPGain += starfishMPGain;
    }

    /**
     * @return The mp gains from resting.
     */
    public int getRestingMPGain() {
        return restingMPGain;
    }

    /**
     * @param restingMPGain
     *            The resting mp gain to set.
     */
    public void setRestingMPGain(
                                 final int restingMPGain) {
        this.restingMPGain = restingMPGain;
    }

    /**
     * @param restingMPGain
     *            The resting mp gain to add.
     */
    public void addRestingMPGain(
                                 final int restingMPGain) {
        this.restingMPGain += restingMPGain;
    }

    /**
     * @return The out-of-encounter mp gains.
     */
    public int getOutOfEncounterMPGain() {
        return outOfEncounterMPGain;
    }

    /**
     * @param outOfEncounterMPGain
     *            The out-of-encounter mp gain to set.
     */
    public void setOutOfEncounterMPGain(
                                        final int outOfEncounterMPGain) {
        this.outOfEncounterMPGain = outOfEncounterMPGain;
    }

    /**
     * @param outOfEncounterMPGain
     *            The out-of-encounter mp gain to add.
     */
    public void addOutOfEncounterMPGain(
                                        final int outOfEncounterMPGain) {
        this.outOfEncounterMPGain += outOfEncounterMPGain;
    }

    /**
     * @return The consumable mp gains.
     */
    public int getConsumableMPGain() {
        return consumableMPGain;
    }

    /**
     * @param consumableMPGain
     *            The consumable mp gain to set.
     */
    public void setConsumableMPGain(
                                    final int consumableMPGain) {
        this.consumableMPGain = consumableMPGain;
    }

    /**
     * @param consumableMPGain
     *            The consumable mp gain to add.
     */
    public void addConsumableMPGain(
                                    final int consumableMPGain) {
        this.consumableMPGain += consumableMPGain;
    }

    /**
     * @return The total mp gains.
     */
    public int getTotalMPGains() {
        return encounterMPGain + consumableMPGain + outOfEncounterMPGain + restingMPGain
               + starfishMPGain;
    }

    /**
     * @param mpGains
     *            The mp gains to set.
     */
    public void setMPGains(
                           final MPGain mpGains) {
        encounterMPGain = mpGains.getEncounterMPGain();
        consumableMPGain = mpGains.getConsumableMPGain();
        outOfEncounterMPGain = mpGains.getOutOfEncounterMPGain();
        restingMPGain = mpGains.getRestingMPGain();
        starfishMPGain = mpGains.getStarfishMPGain();
    }

    /**
     * @param mpGains
     *            The mp gains to add.
     */
    public void addMPGains(
                           final MPGain mpGains) {
        encounterMPGain += mpGains.getEncounterMPGain();
        consumableMPGain += mpGains.getConsumableMPGain();
        outOfEncounterMPGain += mpGains.getOutOfEncounterMPGain();
        restingMPGain += mpGains.getRestingMPGain();
        starfishMPGain += mpGains.getStarfishMPGain();
    }

    @Override
    public int hashCode() {
        int result = 743;
        result = 31 * result + encounterMPGain;
        result = 31 * result + consumableMPGain;
        result = 31 * result + outOfEncounterMPGain;
        result = 31 * result + restingMPGain;
        result = 31 * result + starfishMPGain;

        return result;
    }

    @Override
    public boolean equals(
                          final Object obj) {
        if (this == obj)
            return true;

        if (obj != null && obj instanceof MPGain) {
            final MPGain other = (MPGain) obj;
            return encounterMPGain == other.encounterMPGain
                   && consumableMPGain == other.consumableMPGain
                   && outOfEncounterMPGain == other.outOfEncounterMPGain
                   && restingMPGain == other.restingMPGain
                   && starfishMPGain == other.starfishMPGain;
        }

        return false;
    }
}
